package itcz.example.pattern.create_action.singleton.demo9;

/**
 * @ClassName: Singleton
 * @Author: ITCZ
 * @Date: 2025-04-21
 * @Description: 反射方式破坏单例模式
 */
public class Singleton {

    private static boolean flag = false;

    // 私有构造方法，防止被外部实例化
    private Singleton() {
        /**
         * 防止反射破解单例的问题
         */
        synchronized (Singleton.class) {
            if (flag) {
                throw new RuntimeException("单例模式不允许多个实例");
            }
            System.out.println("创建了单例实例");
            flag = true;
        }
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }

    // 静态内部类，在jvm加载外部类时不会加载内部类，只有内部类的属性/方法被调用时才会被加载，
    // 使用static 修饰 保证只被实例化一次
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

}
